
#ifndef COMMANDSERVE_H_
#define COMMANDSERVE_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <error.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>
#include <dirent.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include<sys/sendfile.h>
#include<mysql/mysql.h>

#include "sql.h"
#include "public.h"

#define SIZE(a) (sizeof(a)/sizeof(a[0]))

enum TRANSFER
{
    WRONG=1,
    DUANDIAN=2,
    MIAO=3,
    NORMAL=4
};

typedef struct node{

  int net_fd;
  struct node* next;
}node_t;

typedef struct queue{

  node_t* head;
  node_t* end;
  int size;
}queue_t;

//入队函数
int enqueue(queue_t* q, int fd);

//出队函数
int dequeue(queue_t* q);



#define TRANINSIZE 4096
//小火车协议
typedef struct server_train_s{
    int len;
    char trainBuf[TRANINSIZE];
}server_train_t;

//利用枚举值指定命令类型
enum command{
    RM,LS,MKDIR,PUTS,GETS,PWD,CD,EXIT,LOGIN,REGIST,ERR
};


typedef struct status{

    int thread_num;

    pthread_t* thread_ids;

    queue_t q;

    pthread_mutex_t lock;
    pthread_cond_t cond;



}status_t;




// mkdir命令（服务端）
int mkdirServe(const int NetFd,MYSQL *connection);
// cd命令（服务端）
int cdServe(const int NetFd,MYSQL *connection);
// ls命令(服务器)
int lsServe(const int NetFd,MYSQL *connection);
// rm命令(服务器)
int rmServe(const int NetFd,MYSQL *connection);

//传文件给客户端
int put_clientfile(int netfd,MYSQL* connection);
//接收客户端传来的文件
int get_clientfile(int netfd,MYSQL* connection);


//初始化线程信息结构体
int init_status(status_t* status, int thread_num);

//初始化线程池
int init_thread_pool(status_t* status);

//初始化tcp连接
int init_socket(int* socket_fd, char* ip, char* port);

//将文件描述符加入epoll监听集合
int add_epoll(int epoll_fd, int fd);

//子线程的入库函数
void*  thread_main(void* argv);

//子线程与客户端交互的函数
int to_work(int net_fd);

//登陆验证函数
bool validate_login(int net_fd, MYSQL* conn);

//注册
bool register_user(int net_fd, MYSQL* conn);

//删除目录
void rm(char* path, int* stat); 

//断点续传函数

int continue_trans(MYSQL* connection,int netfd,const char* hash,const char* path);




#endif

